% 生成示例数据
rng(42); % 设置随机种子以确保可重复性
n_samples = 100; % 样本数量
X = 2 * rand(n_samples, 1); % 生成 0 到 2 之间的随机数作为特征
y = 4 + 3 * X + randn(n_samples, 1); % 生成目标值 y = 4 + 3*X + 噪声

% 可视化数据
figure;
scatter(X, y);
xlabel('X');
ylabel('y');
title('示例数据');

% 初始化参数
w = 0; % 权重
b = 0; % 偏置
learning_rate = 0.01; % 学习率
n_iterations = 1000; % 迭代次数

% 存储损失值
loss_history = zeros(n_iterations, 1);

% 梯度下降算法
for i = 1:n_iterations
    % 计算预测值
    y_pred = w * X + b;
    
    % 计算损失（均方误差）
    loss = mean((y_pred - y).^2);
    loss_history(i) = loss;
    
    % 计算梯度
    dw = (2/n_samples) * sum(X .* (y_pred - y)); % 权重的梯度
    db = (2/n_samples) * sum(y_pred - y); % 偏置的梯度
    
    % 更新参数
    w = w - learning_rate * dw;
    b = b - learning_rate * db;
end

% 输出最终的权重和偏置
fprintf('最终的权重 w = %.4f, 偏置 b = %.4f\n', w, b);

% 可视化预测结果
figure;
scatter(X, y);
hold on;
plot(X, w * X + b, 'r', 'LineWidth', 2);
xlabel('X');
ylabel('y');
title('线性回归预测结果');
legend('真实数据', '预测结果');

% 可视化损失值变化曲线
figure;
plot(1:n_iterations, loss_history, 'b', 'LineWidth', 2);
xlabel('迭代次数');
ylabel('损失值');
title('损失值变化曲线');

% 示例数据的预测结果
X_new = [0.5; 1.5; 2.0]; % 新的特征值
y_new = w * X_new + b; % 预测值

% 输出预测结果
fprintf('新的特征值 X_new = [%.1f; %.1f; %.1f] 的预测结果 y_new = [%.4f; %.4f; %.4f]\n', ...
    X_new(1), X_new(2), X_new(3), y_new(1), y_new(2), y_new(3));